leetcode(脑筋急转弯)

菜 292(E)

中 319(D) 777(B+)

今天就算是娱乐专场了。三道脑筋急转弯。

加餐:zip函数()


292. Nim游戏(E)

分析:额。一开始有点懵,这道题要考什么啊。转弯转在哪里啊。想到了4这个数,加个判断就完成了。

1
2
3
4
5
6
class Solution:
def canWinNim(self, n: int) -> bool:
if n % 4 == 0:
return False
else:
return True

319. 灯泡开关(D)

分析:这道题,有点意思。需要考虑到开关状态跟因子数相关。

(1)第i轮时,被切换的灯泡位置是i的倍数。
(2)由(1)得出,对于第p个灯泡来说,只有其第“因子”轮才会切换,若其有q个因子,则最终被切换q次。因为初始状态是关闭状态,那么因子数是奇数的灯泡最终是亮着的。
(3)只有平方数的因子个数不是成对出现,举例:4=1*4,2*2,其因子是1,2,4。
(4)那么题目最终转化为1~n里平方数的个数,进而转化为对n开平方根,向下取整即可。

1
2
3
class Solution:
def bulbSwitch(self, n: int) -> int:
return math.floor(n ** 0.5)

777. 在LR字符串中交换相邻字符(B+)

L只能跨越X左移,R只能跨越X又移,LR相互之间不可以移动

用两个计数单位分别记录,LX和XR XL和RX。一个正一个负,来比较抵消。

需要注意的是,使用到了zip()函数,扩展在下面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution:
def canTransform(self, start: str, end: str) -> bool:
# left move l right move r
end_has_l = 0
start_has_r = 0
for s, e in zip(start, end): #zip打包成元组(取最短的)
if s == e:
continue
elif end_has_l and s == "L" and e == "X":
# start can move this l to left
end_has_l -= 1
elif start_has_r and s == "X" and e == "R":
# start has r to move right
start_has_r -= 1
elif e == "L":
end_has_l += 1
elif s == "R":
start_has_r += 1
continue
else:
return False
return start_has_r == end_has_l == 0

zip()函数的使用

a = [1,2,3]

b = [4,5,6]
c = [4,5,6,7,8]
zipped = zip(a,b) # 打包为元组的列表
[(1, 4), (2, 5), (3, 6)]
zip(a,c) # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
zip(zipped) # 与 zip 相反,zipped 可理解为解压,返回二维矩阵式
[(1, 2, 3), (4, 5, 6)]

1
2
3
4
5
6
7
8
9
10
>>>nums = ['flower','flow','flight']
>>>for i in zip(*nums):
>>> print(i)
>>>
>>>>>
>>>('f', 'f', 'f')
>>>('l', 'l', 'l')
>>>('o', 'o', 'i')
>>>('w', 'w', 'g')
>>>
0%
undefined